import 'package:flutter/material.dart';
import 'package:kq_flutter_widgets/widgets/tabbar/kq_tab_bar_page_view.dart';

import '../../widgets/tabbar/kq_tab_bar.dart';

/// TabBar + TabBarView 组合
///
/// 使用方法：
// class Test extends BaseTabPage {
//   @override
//   BaseTabPageState<BaseTabPage> getState() => _TestState();
// }
//
// class _TestState extends BaseTabPageState<Test> {
//   @override
//   List<String> getTabNames() {
//     return ["Tab1", "Tab2", "Tab3"];
//   }
//
//   @override
//   int getInitialPage() {
//     return 1;
//   }
//
//   @override
//   IndicatorType getIndicatorType() {
//     return IndicatorType.underline;
//   }
//
//   @override
//   PreferredSizeWidget? buildAppBar() {
//     return KqHeadBar(
//       headTitle: 'back_fix'.tr,
//       back: () {
//         Get.back();
//       },
//     );
//   }
//
//   @override
//   Widget buildCustomView() {
//     return KqOutlineButton(title: '测试');
//   }
//
//   @override
//   List<Widget> buildPageViews() {
//     return [Text('1')， Text('2')， Text('3')];
//   }
// }
///
/// 注意事项：
/// 如果希望Page页面切换后不被销毁，需要在 Page 的 State 使用 with AutomaticKeepAliveClientMixin
///
/// 然后重载此方法
///
/// @override
/// bool get wantKeepAlive => true;
abstract class BaseTabPage extends StatefulWidget {
  const BaseTabPage({super.key});

  @override
  BaseTabPageState createState() {
    return getState();
  }

  BaseTabPageState getState();
}

abstract class BaseTabPageState<T extends BaseTabPage> extends State<T>
    with TickerProviderStateMixin {
  /// 初始化页面下标
  KqTabBarPageViewController getController() {
    return KqTabBarPageViewController(pageIndex: 0);
  }

  /// 是否可以水平滚动，否则均分，默认大于4个就可以滚动
  bool isScrollable() {
    return getTabNames().length >= 5;
  }

  /// 页面是否可以滑动，默认true
  bool isPageScrollable() {
    return true;
  }

  /// 初始化Tab名字
  List<TabDataEntity> getTabNames();

  /// 指示器类型 0:下划线，1：圆角背景
  IndicatorType getIndicatorType() {
    return IndicatorType.underline;
  }

  /// 指示器大小 [TabBarIndicatorSize.tab] 跟随tab宽度，[TabBarIndicatorSize.label] 跟随文字宽度
  TabBarIndicatorSize? getIndicatorSize() {
    // 不传，则下划线类型时，自动使用TabBarIndicatorSize.tab，圆角背景时，自动使用TabBarIndicatorSize.label
    return null;
  }

  /// 自定义标题栏
  PreferredSizeWidget? buildAppBar();

  /// 构建自定义控件，位于AppBar 和 TabBar 之间
  Widget buildCustomView() {
    return Container();
  }

  /// 构建页面
  List<Widget> buildPageViews(List<TabDataEntity> tabs);

  /// 页面改变回调
  onPageChanged(int index, TabDataEntity entity);

  /// 页面关闭拦截，return true则不拦截
  bool onWillPop() {
    return true;
  }

  @override
  Widget build(BuildContext context) {
    var tabs = getTabNames();
    return WillPopScope(
      onWillPop: () async {
        return onWillPop();
      },
      child: Scaffold(
        appBar: buildAppBar(),
        body: Column(
          children: [
            buildCustomView(),
            Expanded(
                child: KqTabBarPageView(
              controller: getController(),
              indicatorType: getIndicatorType(),
              indicatorSize: getIndicatorSize(),
              tabScrollable: isScrollable(),
              pageScrollable: isPageScrollable(),
              tabs: tabs,
              pages: buildPageViews(tabs),
              onPageChanged: onPageChanged,
            ))
          ],
        ),
      ),
    );
  }
}
